package module.auth.impl;

import common.model.Entity.Student;
import dao.StudentDao;
import dao.impl.StudentDaoImpl;
import module.auth.StudentService;
import common.model.Entity.User;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import network.protocol.Response;

import java.util.List;

/**
 * 学生学籍服务实现类
 * <p>
 * 提供学生学籍信息的设置、查询和更新操作。
 * 单例模式，通过 {@link #getInstance()} 获取实例。
 */
public class StudentServiceImpl implements StudentService {

    private final StudentDao studentDao = new StudentDaoImpl();
    private final UserDao userDao = new UserDaoImpl();
    private static final StudentService INSTANCE = new StudentServiceImpl();

    /**
     * 获取单例实例
     *
     * @return StudentServiceImpl 实例
     */
    public static StudentService getInstance() {
        return INSTANCE;
    }

    /**
     * 设置学生学籍信息（通过单独字段）
     *
     * @param age           年龄
     * @param school_year   学年
     * @param stu_id        学号
     * @param class_id      班级
     * @param college       学院
     * @param emergency_num 紧急联系人电话
     * @param family_num    家庭人口
     * @param semester      学期
     * @return 操作结果
     */
    @Override
    public Response<?> SetStuStatus(Integer age, String school_year, String stu_id, String class_id,
                                    String college, String emergency_num, Integer family_num, String semester) {
        Student stu = new Student();
        stu.setStudent_id(stu_id);
        stu.setAge(age);
        stu.setSchool_year(school_year);
        stu.setClass_id(class_id);
        stu.setCollege(college);
        stu.setEmergency_number(emergency_num);
        stu.setFamily_number(family_num);
        stu.setMysemester(semester);

        if (!studentDao.save(stu)) {
            return Response.error("设置学生学籍信息失败，请稍后重试");
        }
        return Response.success();
    }

    /**
     * 设置学生学籍信息（通过 Student 对象）
     *
     * @param stu Student 实体
     * @return 操作结果
     */
    @Override
    public Response<?> SetStuStatus(Student stu) {
        if (!studentDao.save(stu)) {
            return Response.error("设置学生学籍信息失败，请稍后重试");
        }
        return Response.success();
    }

    /**
     * 根据学生 ID 查询学籍信息
     *
     * @param id 学生对应用户 ID
     * @return 学籍信息
     */
    @Override
    public Response<?> SearchStuStatus(Long id) {
        Student stu = studentDao.findById(id).orElse(null);
        if (stu == null) {
            return Response.error("未找到该学生学籍信息");
        }
        return Response.success(stu);
    }

    /**
     * 根据用户名查询学生学籍信息
     *
     * @param username 用户名
     * @return 学籍信息
     */
    @Override
    public Response<?> SearchStuStatus(String username) {
        User us = userDao.findByUsername(username).orElse(null);
        if (us == null) return Response.error("未找到该用户信息");

        Student stu = studentDao.findById(us.getId()).orElse(null);
        if (stu == null) return Response.error("未找到该学生学籍信息");

        return Response.success(stu);
    }

    /**
     * 更新学生学籍信息（通过单独字段）
     *
     * @param Stuid         学号
     * @param age           年龄
     * @param school_year   学年
     * @param semester      学期
     * @param class_id      班级
     * @param college       学院
     * @param emergency_num 紧急联系人电话
     * @param family_num    家庭人口
     * @return 操作结果
     */
    @Override
    public Response<?> UpdateStuStatus(String Stuid, Integer age, String school_year, String semester,
                                       String class_id, String college, String emergency_num, Integer family_num) {
        Student stu = new Student();
        stu.setStudent_id(Stuid);
        stu.setAge(age);
        stu.setSchool_year(school_year);
        stu.setClass_id(class_id);
        stu.setCollege(college);
        stu.setEmergency_number(emergency_num);
        stu.setFamily_number(family_num);
        stu.setMysemester(semester);

        if (!studentDao.update(stu)) {
            return Response.error("更新学生学籍信息失败，请稍后重试");
        }
        return Response.success();
    }

    /**
     * 更新学生学籍信息（通过 Student 对象）
     *
     * @param stu Student 实体
     * @return 操作结果
     */
    @Override
    public Response<?> UpdateStuStatus(Student stu) {
        if (!studentDao.update(stu)) {
            return Response.error("更新学生学籍信息失败，请稍后重试");
        }
        return Response.success();
    }

    /**
     * 查询所有学生学籍信息
     *
     * @return 学生列表
     */
    @Override
    public Response<?> SearchAllStuStatus() {
        List<Student> stus = studentDao.findAll();
        if (stus.isEmpty()) {
            return Response.error("未找到任何学生学籍信息");
        }
        return Response.success(stus);
    }
}
